/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package td3.Modele;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import td3.Vue.FenetrePrincipale;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 *
 * @author fredericdasilva
// */
public class JeuDeMorpion extends Jeu {
    
    private volatile Thread tache = null;
    
    public JeuDeMorpion(Joueur a, Joueur b){
        
        
        super(a,b);
        P=new PlateauMorpion();
        P.initialiser();
        
        //P = new PlateauMorpion();
        //P.initialiser();
        //J1= a;
        //J2=b;
        
    }
    
    public boolean partieTerminee(){
//        boolean b=true;
//        
//        for (int i=0;i<P.longueur;i++){
//            for (int j=0;j<P.largeur;j++){
//                b=(b&&P.etatIdPlateau[i][j]!=0);
//            }
//        }
//        
//        return b;
        return(P.nbCoups==P.largeur*P.longueur || AGagne());
    }
//         int a, b;
//       a=1; b=1;
//        f.tab[a][b].addMouseListener(f.tab[a][b]);
       
    
    
   /* private*/@Override
    public Joueur joueurSuivant() {
        /*if (P.joueurencours==0)
         * {return J1;}*/
      
        /*else */if (P.joueurencours==J1.getId()){
            return J2;
        }
        else {
            return J1;
        }
    }
   
   public Joueur quelleJoueur(int id){
       if (id==J1.getId()){
           return J1;
   }
   else return J2;
   } 
   /* private*/@Override
    public String nomJoueurSuivant() {
      return joueurSuivant().getName();
    }
   
   
   
    
    @Override
    public boolean coupPossible(Coup coup){
        return (P.etatIdPlateau[coup.x][coup.y]==0);
    }
    @Override
    public void jouerCoupJeuJoueurHumain(Coup c, int idJeu){
        P.appliquerCoup(c, idJeu);
                setChanged();
                notifyObservers(c);
    }
    @Override
    public void jouerCoupJeu(Coup c, int idJeu){
        P.appliquerCoup(c, idJeu);
                setChanged();
                notifyObservers(c);
                //f.tab[c.x][c.y].mettreCouleur(c.x, c.y);
                try {
                    Thread.sleep(1000);
                    
                } catch (InterruptedException ex) {
                    Thread.currentThread().interrupt(); // Très important de réinterrompre
                
//                   Logger.getLogger(JeuDeMorpion.class.getName()).log(Level.SEVERE, null, ex);
                }
        
    }
    @Override
    public void/*Joueur*/ jouerPartie(){
        
        Joueur retour;
        while (!this.partieTerminee()&&!this.AGagne()){
            retour =  this.joueurSuivant();
            if (retour instanceof JoueurHumain){
//                if (this.hasChanged()){
//                    break;
//                }
        }
            else {
                Coup c= retour.getCoup(this.P);
                if (this.coupPossible(c)){
                //                P.appliquerCoup(c, retour.getId());
                this.jouerCoupJeu(c, retour.getId());
                
//                jouerCoupJeuJoueurHumain(c, retour.getId());
                System.out.println(this.P.toString());
                System.out.println(this.P.nbCoups+" Coups joués");

            }
            else {
                c= retour.getCoup(this.P);
                while (!this.coupPossible(c)){ 
                    c= retour.getCoup(this.P);
                }
                this.jouerCoupJeu(c, retour.getId());
//                jouerCoupJeuJoueurHumain(c, retour.getId());
                System.out.println(this.P.toString());
                System.out.println(this.P.nbCoups+" Coups joués");
            }
                
            }
            
            
            
            
        }
    this.quiAGagne();
        
    }
    
    public boolean AGagne() {
        boolean b=false;
        
        if (P.etatIdPlateau[0][0]!=0&&P.etatIdPlateau[0][0]==P.etatIdPlateau[0][1]&&P.etatIdPlateau[0][1]==P.etatIdPlateau[0][2]){
            b=true;
            return b;
            
        }
        else if (P.etatIdPlateau[1][0]!=0&&P.etatIdPlateau[1][0]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[1][2]){
            b=true;
            return b;
        }
        else if (P.etatIdPlateau[2][0]!=0&&P.etatIdPlateau[2][0]==P.etatIdPlateau[2][1]&&P.etatIdPlateau[2][1]==P.etatIdPlateau[2][2]){
            b=true;
            return b;
        }
        else if (P.etatIdPlateau[0][0]!=0&&P.etatIdPlateau[0][0]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[2][2]){
            b=true;
            return b;
        }
        else if (P.etatIdPlateau[2][0]!=0&&P.etatIdPlateau[2][0]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[0][2]){
            b=true;
            return b;
        }
        else if (P.etatIdPlateau[0][0]!=0&&P.etatIdPlateau[0][0]==P.etatIdPlateau[1][0]&&P.etatIdPlateau[1][0]==P.etatIdPlateau[2][0]){
            
            b=true;
            return b;
        }
        else if (P.etatIdPlateau[0][1]!=0&&P.etatIdPlateau[0][1]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[2][1]){
            
            b=true;
            return b;
        }
        else if (P.etatIdPlateau[0][2]!=0&&P.etatIdPlateau[0][2]==P.etatIdPlateau[1][2]&&P.etatIdPlateau[1][2]==P.etatIdPlateau[2][2]){
            
            b=true;
            return b;
        }
        else { b=false; return b;
        }
    }
    //}
    public void quiAGagne() {
        //if (partieTerminee()){
        int i=0;
        
        if (P.etatIdPlateau[0][0]!=0&&P.etatIdPlateau[0][0]==P.etatIdPlateau[0][1]&&P.etatIdPlateau[0][1]==P.etatIdPlateau[0][2]){
            i=P.etatIdPlateau[0][1];
            P.gagnantId=i;
            System.out.println("Le joueur "+quelleJoueur(i).getName()+" Id "+i+" a gagné");
        }
        else if (P.etatIdPlateau[1][0]!=0&&P.etatIdPlateau[1][0]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[1][2]){
            i=P.etatIdPlateau[1][0];
            P.gagnantId=i;
            System.out.println("Le joueur "+quelleJoueur(i).getName()+" Id "+i+" a gagné");
        }
        else if (P.etatIdPlateau[2][0]!=0&&P.etatIdPlateau[2][0]==P.etatIdPlateau[2][1]&&P.etatIdPlateau[2][1]==P.etatIdPlateau[2][2]){
            i=P.etatIdPlateau[2][0];
            P.gagnantId=i;
            System.out.println("Le joueur "+quelleJoueur(i).getName()+" Id "+i+" a gagné");
        }
        else if (P.etatIdPlateau[0][0]!=0&&P.etatIdPlateau[0][0]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[2][2]){
            i=P.etatIdPlateau[0][0];
            P.gagnantId=i;
            System.out.println("Le joueur "+quelleJoueur(i).getName()+" Id "+i+" a gagné");
        }
        else if (P.etatIdPlateau[2][0]!=0&&P.etatIdPlateau[2][0]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[0][2]){
            i=P.etatIdPlateau[2][0];
            P.gagnantId=i;
            System.out.println("Le joueur "+quelleJoueur(i).getName()+" Id "+i+" a gagné");
        }
        else if (P.etatIdPlateau[0][0]!=0&&P.etatIdPlateau[0][0]==P.etatIdPlateau[1][0]&&P.etatIdPlateau[1][0]==P.etatIdPlateau[2][0]){
            i=P.etatIdPlateau[0][0];
            P.gagnantId=i;
            System.out.println("Le joueur "+quelleJoueur(i).getName()+" Id "+i+" a gagné");
        }
        else if (P.etatIdPlateau[0][1]!=0&&P.etatIdPlateau[0][1]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[2][1]){
            i=P.etatIdPlateau[0][1];
            P.gagnantId=i;
            System.out.println("Le joueur "+quelleJoueur(i).getName()+" Id "+i+" a gagné");
        }
        else if (P.etatIdPlateau[0][2]!=0&&P.etatIdPlateau[0][2]==P.etatIdPlateau[1][2]&&P.etatIdPlateau[1][2]==P.etatIdPlateau[2][2]){
            i=P.etatIdPlateau[0][2];
            P.gagnantId=i;
            System.out.println("Le joueur "+quelleJoueur(i).getName()+" Id "+i+" a gagné");
        }
        else{
            System.out.println("----------- MATCH NUL -------------");
        }
    }
    
    public String quiStringAGagne() {
        //if (partieTerminee()){
        int i=0;
        
        if (P.etatIdPlateau[0][0]!=0&&P.etatIdPlateau[0][0]==P.etatIdPlateau[0][1]&&P.etatIdPlateau[0][1]==P.etatIdPlateau[0][2]){
            i=P.etatIdPlateau[0][1];
            P.gagnantId=i;
            return " "+quelleJoueur(i).getName()+" Id "+i+" a gagné";
        }
        else if (P.etatIdPlateau[1][0]!=0&&P.etatIdPlateau[1][0]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[1][2]){
            i=P.etatIdPlateau[1][0];
            P.gagnantId=i;
            return " "+quelleJoueur(i).getName()+" Id "+i+" a gagné";        }
        else if (P.etatIdPlateau[2][0]!=0&&P.etatIdPlateau[2][0]==P.etatIdPlateau[2][1]&&P.etatIdPlateau[2][1]==P.etatIdPlateau[2][2]){
            i=P.etatIdPlateau[2][0];
            P.gagnantId=i;
            return " "+quelleJoueur(i).getName()+" Id "+i+" a gagné";        }
        else if (P.etatIdPlateau[0][0]!=0&&P.etatIdPlateau[0][0]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[2][2]){
            i=P.etatIdPlateau[0][0];
            P.gagnantId=i;
            return " "+quelleJoueur(i).getName()+" Id "+i+" a gagné";        }
        else if (P.etatIdPlateau[2][0]!=0&&P.etatIdPlateau[2][0]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[0][2]){
            i=P.etatIdPlateau[2][0];
            P.gagnantId=i;
            return "Le joueur "+quelleJoueur(i).getName()+" Id "+i+" a gagné";        }
        else if (P.etatIdPlateau[0][0]!=0&&P.etatIdPlateau[0][0]==P.etatIdPlateau[1][0]&&P.etatIdPlateau[1][0]==P.etatIdPlateau[2][0]){
            i=P.etatIdPlateau[0][0];
            P.gagnantId=i;
            return " "+quelleJoueur(i).getName()+" Id "+i+" a gagné";        }
        else if (P.etatIdPlateau[0][1]!=0&&P.etatIdPlateau[0][1]==P.etatIdPlateau[1][1]&&P.etatIdPlateau[1][1]==P.etatIdPlateau[2][1]){
            i=P.etatIdPlateau[0][1];
            P.gagnantId=i;
            return " "+quelleJoueur(i).getName()+" Id "+i+" a gagné";
        }
        else if (P.etatIdPlateau[0][2]!=0&&P.etatIdPlateau[0][2]==P.etatIdPlateau[1][2]&&P.etatIdPlateau[1][2]==P.etatIdPlateau[2][2]){
            i=P.etatIdPlateau[0][2];
            P.gagnantId=i;
            return " "+quelleJoueur(i).getName()+" Id "+i+" a gagné";
        }
        else{
            return("---- MATCH NUL ----");
        }
    }
    
    
    public void jouerJeuFenetre(){
        
        System.out.println(P.toString());
        Joueur retour;
        while (!partieTerminee()&&!AGagne()){
            retour =  joueurSuivant();
            if (retour instanceof JoueurHumain){
                if (hasChanged()){
                    break;
                }
        }
            else {
                Coup c= retour.getCoup(P);
                if (coupPossible(c)){
                //                P.appliquerCoup(c, retour.getId());
                jouerCoupJeu(c, retour.getId());
                
//                jouerCoupJeuJoueurHumain(c, retour.getId());
                System.out.println(P.toString());
                System.out.println(P.nbCoups+" Coups joués");

            }
            else {
                c= retour.getCoup(P);
                while (!coupPossible(c)){ 
                    c= retour.getCoup(P);
                }
                jouerCoupJeu(c, retour.getId());
//                jouerCoupJeuJoueurHumain(c, retour.getId());
                System.out.println(P.toString());
                System.out.println(P.nbCoups+" Coups joués");

            }
                
            }
            try {
                if(!tache.isInterrupted()){
            Thread.sleep(1200);
                }
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
//            Logger.getLogger(JeuDeMorpion.class.getName()).log(Level.SEVERE, null, ex);
        }
            
            
            
        }
    }
    @Override
    public void run(){
        
         
         tache = Thread.currentThread();
 while (! tache.isInterrupted())
            {
        try
        {
            
                // Do task
                this.jouerPartie();
 
                Thread.sleep (2000);
            
        }
        catch (InterruptedException exception){
            tache.interrupt(); // Très important de réinterrompre
                break;
        }
     }
    }
    
    @Override
    public void arreter()
    {
        tache.interrupt();
    }
//}
}
